#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

#define AUTOMOBIL 0
#define AUTOBUS 1
#define KAMION 2
#define brSever 10
#define brJug 10

int severNaNadvoznjaku = 0;
int jugNaNadvoznjaku = 0;
int brAutobusaNaNadvoznjaku = 0;
int brKamionaNaNadvoznjaku = 0;

pthread_mutex_t mutex;
pthread_cond_t condjug;
pthread_cond_t condsever;

void *Sever(void *arg)
{
    long id = (long)*arg;
    sleep(rand()%3);
    
    // if(tipVozila == AUTOMOBIL)
    // {
    //     printf("Vozilo %d prelazi nadvoznjak sa severne strane", id);
        
    // }
    // else if(tipVozila == AUTOBUS){
    //     printf("Vozilo %d prelazi nadvoznjak sa severne strane", id);
    // }
    // else{
    //     printf("Vozilo %d prelazi nadvoznjak sa severne strane", id);
    // }

    if(tipVozila == AUTOMOBIL){
        pthread_mutex_lock(mutex);
        while(jugNaNadvoznjaku >0 || brKamionaNaNadvoznjaku >0){
            pthread_cond_wait(condsever, &mutex);
        }
        severNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa automobil prelazi nadvoznjak sa severne strane", id);
        sleep(3);
        printf("Vozilo %d tipa automobil je preslo nadvoznjak sa severne strane", id);
        severNaNadvoznjaku--;
        if(severNaNadvoznjaku == 0)
        {
            pthread_cond_breakcast(condsever);
        }

    }
    else if(tipVozila == AUTOBUS)
    {
        pthread_mutex_lock(mutex);
        while(jugNaNadvoznjaku >0 || brAutobusaNaNadvoznjaku >0 || brKamionaNaNadvoznjaku ){
            pthread_cond_wait(condsever, &mutex);
        }
        severNaNadvoznjaku++;
        brAutobusaNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa autobus prelazi nadvoznjak sa severne strane", id);
        sleep(3);
        printf("Vozilo %d tipa autobus je preslo nadvoznjak sa severne strane", id);           
        severNaNadvoznjaku--;
        brAutobusaNaNadvoznjaku--;
        if(severNaNadvoznjaku == 0)
        {
            pthread_cond_breakcast(condsever);
        }
    }
    else{
        pthread_mutex_lock(mutex);
        while(jugNaNadvoznjaku >0 || brAutobusaNaNadvoznjaku >0 || brKamionaNaNadvoznjaku>0 ){
            pthread_cond_wait(condsever, &mutex);
        }
        severNaNadvoznjaku++;
        brKamionaNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa kamion prelazi nadvoznjak sa severne strane", id);
        sleep(3);
        printf("Vozilo %d tipa kamion je preslo nadvoznjak sa severne strane", id);
        severNaNadvoznjaku--;
        brKamionaNaNadvoznjaku--;
        if(severNaNadvoznjaku == 0)
        {
            pthread_cond_breakcast(condsever);
        }
    }

    return NULL;
}

void *Jug(void *arg)
{
    long id = (long)*arg;
    sleep(rand()%3);
    // if(tipVozila == AUTOMOBIL)
    // {
    //     printf("Vozilo %d prelazi nadvoznjak sa juzne strane", id);
        
    // }
    // else if(tipVozila == AUTOBUS){
    //     printf("Vozilo %d prelazi nadvoznjak sa juzne strane", id);
    // }
    // else{
    //     printf("Vozilo %d prelazi nadvoznjak sa juzne strane", id);
    // }

    if(tipVozila == AUTOMOBIL){
        pthread_mutex_lock(mutex);
        while(severNaNadvoznjaku >0 || brKamionaNaNadvoznjaku >0 ){
            pthread_cond_wait(condjug, &mutex);
        }
        jugNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa automobil prelazi nadvoznjak sa juzne strane", id);


        sleep(3);
        printf("Vozilo %d tipa automobil je preslo nadvoznjak sa juzne strane", id);
        jugNaNadvoznjaku--;
        if(jugNaNadvoznjaku ==0){
            pthread_cond_breakcast(condjug);
        }
    }
    else if(tipVozila == AUTOBUS){
        pthread_mutex_lock(mutex);
        while(severNaNadvoznjaku >0 || brAutobusaNaNadvoznjaku >0 || brKamionaNaNadvoznjaku >0 ){
            pthread_cond_wait(condjug, &mutex);
        }
        jugNaNadvoznjaku++;
        brAutobusaNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa autobus prelazi nadvoznjak sa juzne strane", id);


        sleep(3);
        printf("Vozilo %d tipa autobus je preslo nadvoznjak sa juzne strane", id);
        jugNaNadvoznjaku--;
        brAutobusaNaNadvoznjaku--;
        if(jugNaNadvoznjaku ==0){
            pthread_cond_breakcast(condjug);
        }

    }
    else
    {
        pthread_mutex_lock(mutex);
        while(severNaNadvoznjaku >0 || brAutobusaNaNadvoznjaku >0 || brKamionaNaNadvoznjaku >0 ){
            pthread_cond_wait(condjug, &mutex);
        }
        jugNaNadvoznjaku++;
        brKamionaNaNadvoznjaku++;
        pthread_mutex_unlock(mutex);

        printf("Vozilo %d tipa kamion prelazi nadvoznjak sa juzne strane", id);


        sleep(3);
        printf("Vozilo %d tipa kamion je preslo nadvoznjak sa juzne strane", id);
        jugNaNadvoznjaku--;
        brKamionaNaNadvoznjaku--;
        if(jugNaNadvoznjaku ==0){
            pthread_cond_breakcast(condjug);
        }

    }
    return NULL;
}


int main(){
    srand(time(NULL));
    pthread_mutex_init(mutex, NULL);
    pthread_cond_init(cond, NULL);
    pthread_t threads[br];

    for(int i = 0; i<br; i++)
    {
        pthread_create(&threads[i], NULL, br)
        sleep(rand()%3);
    }
    for(int i = 0; i<br; i++)
    {
        pthread_create(&threads[i], NULL, br)
        sleep(rand()%3);
    }
    for(int i = 0; i<br; i++)
    {
        pthread_create(&threads[i], NULL, br)
        sleep(rand()%3);
    }

}
